<?php
def("amicitia/persistencia/daos/","DaoDeseo");
def("amicitia/persistencia/daos/","ConexionBD");
def("amicitia/modelo/entidades/","Deseo");
def("amicitia/modelo/entidades/","Persona");
def("amicitia/modelo/entidades/","Juego");
def("amicitia/persistencia/excepciones/","IntegridadDatosException");

/**
 * Maneja todas las consideraciones de persistencia en MySql para con la
 * entidad Deseo.
 * 
 * @author Willy A. Kuster
 */
class DaoDeseoMySql implements DaoDeseo {

	const SELECT_DESEO = "SELECT id, id_juego_fk, id_iluso_fk, texto, regalo FROM deseo WHERE id=%s";
	const SELECT_DESEO_JUEGO_PERSONA = "SELECT id, id_juego_fk, id_iluso_fk, texto, regalo FROM deseo WHERE id_juego_fk=%s AND id_iluso_fk=%s";
	const INSERT_DESEO = "INSERT INTO deseo (id,id_juego_fk,id_iluso_fk,texto,regalo) VALUES (%s,%s,%s,%s,%s)";
	const DELETE_DESEO = "DELETE FROM deseo WHERE id=%s";

	private $conexion;

	public function __construct() {
		$this->conexion = ConexionBD::getConexionBD();
		//$this->conexion->conectar();
	}

	/**
	 * @see persistencia/daos/DaoDeseo#obtenerDeseo($id)
	 */
	public function obtenerDeseo($id) {
		
		$id = $this->conexion->escaparCadena($id);
		$query = sprintf(self::SELECT_DESEO,$id);
		$result = $this->conexion->seleccionar($query);

		if($obj = $result->fetch_object()){
			$deseo = $this->generarDeseo($obj);

			$result->close();

			return $deseo;
		} else {
			return NULL;
		}
		
	}
	
	/**
	 * @see persistencia/daos/DaoDeseo#obtenerDeseoDeJuegoYPersona($juego, $persona)
	 */
	public function obtenerDeseoDeJuegoYPersona(Juego $juego,Persona $persona) {
		$id_juego_fk = $this->conexion->escaparCadena($juego->getId());
		$id_iluso_fk = $this->conexion->escaparCadena($persona->getId());
		$query = sprintf(self::SELECT_DESEO_JUEGO_PERSONA,$id_juego_fk,$id_iluso_fk);
		$result = $this->conexion->seleccionar($query);

		if($obj = $result->fetch_object()){
			$deseo = $this->generarDeseo($obj);

			$result->close();

			return $deseo;
		} else {
			return NULL;
		}
	}
	
	/**
	 * Crea un objeto Deseo a partir de un resultado de base de datos.
	 * 
	 * @param $obj
	 * 			Un objeto proveniente de la llamada $result->fetch_object().
	 * @return Deseo
	 * 			Un objeto Deseo.
	 */
	private function generarDeseo($obj) {
		$deseo = new Deseo();
		$deseo->setId($obj->id);
		$deseo->setRegalo($obj->regalo);
		$deseo->setTexto($obj->texto);
		
		$fabricaDao = FabricaDao::obtenerFabrica();
		$daoPersona = $fabricaDao->obtenerDaoPersona();
		$deseo->setIluso($daoPersona->obtenerPersona($obj->id_iluso_fk));
		
		return $deseo;
	}
	
	/**
	 * @see persistencia/daos/DaoDeseo#guardarDeseo($deseo)
	 */
	public function guardarDeseo(Deseo $deseo,Juego $juego) {
		
		$this->verificarDeseoYJuego($deseo,$juego);
		
		$id = is_null($deseo->getId()) ? "NULL" : (int)$this->conexion->escaparCadena($deseo->getId());
		$id_juego_fk = (int)$this->conexion->escaparCadena($juego->getId());
		$id_iluso_fk = (int)$this->conexion->escaparCadena($deseo->getIluso()->getId());
		$texto = "'".$this->conexion->escaparCadena($deseo->getTexto())."'";
		$regalo = "'".$this->conexion->escaparCadena($deseo->getRegalo())."'";
		
		$query = sprintf(self::INSERT_DESEO,$id,$id_juego_fk,$id_iluso_fk,$texto,$regalo);
		$id = $this->conexion->insertar($query);
		return $id;
		
	}
	
	/**
	 * @see persistencia/daos/DaoDeseo#eliminarDeseo($id)
	 */
	public function eliminarDeseo($id) {
		
		$id = $this->conexion->escaparCadena($id);
		$query = sprintf(self::DELETE_DESEO,$id);
		$afectados = $this->conexion->actualizarOEliminar($query);
		
		if ($afectados==1) {
			return true;
		} else {
			return false;
		}
		
	}
	
	/**
	 * Verifica la integridad de los objeto Deseo y Juego que se pasen por parámetro.
	 * 
	 * @param $deseo
	 * 			Un objeto Deseo.
	 * @param $juego
	 * 			Un objeto Juego.
	 */
	private function verificarDeseoYJuego(Deseo $deseo,Juego $juego) {
		if(is_null($deseo->getIluso()))
			throw new IntegridadDatosException(get_class($deseo),"iluso",$deseo->getIluso());
		if(is_null($deseo->getIluso()->getId()))
			throw new IntegridadDatosException(get_class($deseo->getIluso()),"id",$deseo->getIluso()->getId());
		if(is_null($deseo->getTexto()) || $deseo->getTexto()=="")
			throw new IntegridadDatosException(get_class($deseo),"texto",$deseo->getTexto());
		if(is_null($deseo->getRegalo()) || $deseo->getRegalo()=="")
			throw new IntegridadDatosException(get_class($deseo),"regalo",$deseo->getRegalo());
		if(is_null($juego->getId()))
			throw new IntegridadDatosException(get_class($juego),"id",$juego->getId());
	}
	
}
?>